#ifndef __DYNAMICARRAY_H_
#define __DYNAMICARRAY_H_


class DynamicArray
{
public:
    using ElementType = void*;
    DynamicArray(); //无参构造
    ~DynamicArray();
    DynamicArray(const DynamicArray& array); // 拷贝函数
    void operator=(const DynamicArray& array);  // 运算符重载
    // bool operator==(const DynamicArray& array);



    void SetFreePtr(void (*FreePtr)(ElementType));
    void SetShowPtr(void (*ShowPtr)(ElementType));
    void SetCompare(bool (*Compare)(ElementType,ElementType));


    //删除
    void RemoveByIndex(int index); // 按下标删除
    void RemoveByElement(ElementType element); //按元素删除
    void Duplicate();

    //插入
    void InsertTail(const ElementType& element);//尾插法
    void InsertHead(const ElementType& element);//头插法
    void InsertByIndex(const ElementType &element,int index);//中间插入

    //查找
    DynamicArray FindByElement(const ElementType& element);//按元素查找
    ElementType FindByIndex(int index);//按下标查找
    int BinarySearch(ElementType element);  //二分查找
    //排序
    void Sort();
    

    //显示
    void show();

private:
    void FastSort(int start,int end,int depth,int MaxDepth);
    void InsertSort(int start,int end);
    int Partition(int start,int end);
    ElementType* a;
    int capacity;
    int size;

    void (*FreePtr)(ElementType);
    void (*ShowPtr)(ElementType);
    bool (*Compare)(ElementType,ElementType);
};

#endif